﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Cataloger
{
    public partial class FrmNowyNosnik : Form
    {
		#region Fields (5) 

        Katalog katalogDoBG;
        SortedList<string, string> listaDyskow = new SortedList<string, string>();
        DriveInfo nosnikDoBG;
        FrmSkanowanie skan;
        public static UstawieniaSkanowania us=new UstawieniaSkanowania();

		#endregion Fields 

		#region Constructors (1) 

        public FrmNowyNosnik()
        {

            InitializeComponent();
            cylinderGauge2.FillPercentage = 0;
            cylinderGauge3.FillPercentage = 0;
            statusLight1.Value = 0;
            DaneLaczneDyskow();
            wyswietlWszytskie();
            comboBox2.Items.AddRange(Katalog.WczytaneKatalogi.ToArray());
            
            

        }
        public FrmNowyNosnik(Katalog kat):this()
        {
            comboBox2.Text = kat.ToString();
            comboBox2.SelectedItem = kat;
            comboBox2.Refresh();
            comboBox1.Update();
            this.WykryjDyskSkanowany();
        }
        public FrmNowyNosnik(Katalog kat, Nosnik n):this(kat)
        {
            comboBox1.Text=(n.NazwaNapedu().Name + " " + n.NazwaNapedu().VolumeLabel + " " + n.NazwaNapedu().RodzajDysku());
            comboBox1.SelectedItem = comboBox1.Text;
            comboBox1.Refresh();
            comboBox1.Update();
            WykryjDyskSkanowany();
        }

		#endregion Constructors 

		#region Methods (41) 

		// Private Methods (41) 

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            
            KatalogujNosnik(nosnikDoBG, katalogDoBG,nazwaAl);
           
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            skan.Close();
            this.btnSkanuj.Enabled = true;
            this.btnSkanuj.Text = "Aktualizuj";
            WykryjDyskSkanowany();
            foreach (Control c in this.Controls)
            {
                c.Enabled = true;
            }
            MessageBox.Show(Properties.Resources.info1 + " " + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].Nazwa + " " + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].Etykieta);
               //+
            //                "\nZeskanowano łącznie:\nFolderów:\t\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.IleFolderow.ToString() +
            //                "\nPlików:\t\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.IlePlikow.ToString() +
            //                "\nDanych:\t\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.RozmiarZeskanowany.ToProperUnit() +
            //                "\nArchiwów:\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.IleArchiwow.ToString() +
            //                "\nOpisów:\t\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.IleOpisow.ToString() +
            //                "\nCzas skanowania:\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.CzasSkanowania.Seconds+" sekund" +
            //                "\nNiepowodzenia:\n " + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.RaportNiepowodzen.ToString(),"Raport skanowania",MessageBoxButtons.OK,MessageBoxIcon.Information,MessageBoxDefaultButton.Button1,MessageBoxOptions.DefaultDesktopOnly);
        }

        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            foreach (Nosnik n in Katalog.WczytaneKatalogi[katalogDoBG.ToString()].Nosniki)
            {
                if ((this.nosnikDoBG.VolumeSerial() == n.NrSeryjny) && (this.nosnikDoBG.TotalSize == n.Wielkosc))
                {
                    n.Aktualizuj(us);
                    
                }
            }
        }

        private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            skan.Close();
            this.btnSkanuj.Enabled = true;
            this.btnSkanuj.Text = "Aktualizuj";
            WykryjDyskSkanowany();
            foreach (Control c in this.Controls)
            {
                c.Enabled = true;
            }
            MessageBox.Show("Aktualizacja zakończona" + " " + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].Nazwa + " " + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].Etykieta);
                //+
            //                "\nZeskanowano łącznie:\nFolderów:\t\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.IleFolderow.ToString() +
            //                "\nPlików:\t\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.IlePlikow.ToString() +
            //                "\nDanych:\t\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.RozmiarZeskanowany.ToProperUnit() +
            //                "\nArchiwów:\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.IleArchiwow.ToString() +
            //                "\nOpisów:\t\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.IleOpisow.ToString() +
            //                "\nCzas skanowania:\t" + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.CzasSkanowania.Seconds+" sekund" +
            //                "\nNiepowodzenia:\n " + katalogDoBG.Nosniki[katalogDoBG.Nosniki.Count - 1].RaportSkan.RaportNiepowodzen.ToString(),"Raport skanowania",MessageBoxButtons.OK,MessageBoxIcon.Information,MessageBoxDefaultButton.Button1,MessageBoxOptions.DefaultDesktopOnly);
        }
        string nazwaAl = "";
        private void button1_Click(object sender, EventArgs e)
        {
            if (btnSkanuj.Text == "Skanuj")
            {
                us = new UstawieniaSkanowania();
                foreach (string ch in checkedListBox1.CheckedItems)
                {
                    switch (ch)
                    {
                        case "PlikiOffice":
                            {
                                us.PobierzOpisOffice = true;
                            }
                            break;
                        case "ExifInfo":
                            {
                                us.PobierzExifInfo = true;
                            }
                            break;
                        case "ArchiwaZip":
                            {
                                us.ArchiwaZip = true;
                            }
                            break;
                        case "ArchiwaRar":
                            {
                                us.ArchiwaRar = true;
                            }
                            break;
                        case "MP3_TAG":
                            {
                                us.MP3Tag = true;
                            }
                            break;
                        case "AudioWideoInfo":
                            {
                                us.AudioWideo = true;
                            }
                            break;
                        default:
                            {

                            }
                            break;
                    }


                }
                
                nosnikDoBG = new DriveInfo(comboBox1.SelectedItem.ToString().Substring(0, 2));
                katalogDoBG=(Katalog)comboBox2.SelectedItem;
                
                FrmPodajNazweNosnika fPodajNazwa = new FrmPodajNazweNosnika(nosnikDoBG);
                if (fPodajNazwa.ShowDialog() == DialogResult.OK)
                {
                    nazwaAl = fPodajNazwa.Nazwa;
                }
                this.btnSkanuj.Enabled = false;
                this.btnSkanuj.Text = "SKANOWANIE";
                skan = new FrmSkanowanie(comboBox1.SelectedItem.ToString().Substring(0, 3));
                foreach (Control c in this.Controls)
                {
                    c.Enabled = false;
                }
                skan.Show();
                backgroundWorker1.RunWorkerAsync();
                
               
             //  Skanuj();
            }
            else if(btnSkanuj.Text=="Aktualizuj")
            {
                us = new UstawieniaSkanowania();
                foreach (string ch in checkedListBox1.CheckedItems)
                {
                    switch (ch)
                    {
                        case "PlikiOffice":
                            {
                                us.PobierzOpisOffice = true;
                            }
                            break;
                        case "ExifInfo":
                            {
                                us.PobierzExifInfo = true;
                            }
                            break;
                        case "ArchiwaZip":
                            {
                                us.ArchiwaZip = true;
                            }
                            break;
                        case "ArchiwaRar":
                            {
                                us.ArchiwaRar = true;
                            }
                            break;
                        case "MP3_TAG":
                            {
                                us.MP3Tag = true;
                            }
                            break;
                        case "AudioWideoInfo":
                            {
                                us.AudioWideo = true;
                            }
                            break;
                        default:
                            {

                            }
                            break;
                    }


                }

                nosnikDoBG = new DriveInfo(comboBox1.SelectedItem.ToString().Substring(0, 2));
                katalogDoBG = (Katalog)comboBox2.SelectedItem;

                this.btnSkanuj.Enabled = false;
                this.btnSkanuj.Text = "AKTUALIZOWANIE";
                skan = new FrmSkanowanie(comboBox1.SelectedItem.ToString().Substring(0, 3));
                foreach (Control c in this.Controls)
                {
                    c.Enabled = false;
                }
                skan.Show();

                backgroundWorker2.RunWorkerAsync();


                //  Skanuj();
            }
        }

        private void button13_Click(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            FrmGlowna.TworzNowyKatalog();
            comboBox2.Items.Clear();
            comboBox2.Items.AddRange(Katalog.WczytaneKatalogi.ToArray());
        }

        private void button4_Click(object sender, EventArgs e)
        {
            DriveInfo di = new DriveInfo(comboBox1.SelectedItem.ToString().Substring(0, 2));
            di.WysunDyskCD();
            button4.Enabled = false;
            odswiez();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            odswiez();
        }

        private void button6_Click(object sender, EventArgs e)
        {
            DaneLaczneDyskow();
            odswiez();
        }

        private void button7_Click(object sender, EventArgs e)
        {

        }

        private void button8_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                checkedListBox1.SetItemChecked(i, true);
            }
        }

        private void checkedListBox2_ItemCheck(object sender, ItemCheckEventArgs e)
        {


        }

        private void checkedListBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            DriveInfo di = new DriveInfo(comboBox1.SelectedItem.ToString().Substring(0,2));
            if (di.DriveType == DriveType.CDRom)
                button4.Enabled = true;
            else
                button4.Enabled = false;
            di.DrzewoKatalogow(treeView1);
            InfoDysk(di);
            di.WykresZajetosc(progressBar2);
            cylinderGauge2.FillPercentage = Convert.ToInt32(di.ProcentowoZajete());
            cylinderGauge3.FillPercentage = Convert.ToInt32(di.ProcentowoWzgledemCalosci());
            WykryjDyskSkanowany();
         
        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            WykryjDyskSkanowany();

        }

        private void DaneLaczneDyskow()
        {
            Drive.DyskiFizyczne(listaDyskow);
            textBox1.Text = Drive.OpisIleNosnikow();
            textBox2.Text = Drive.InformacjeORozmiarze();
            Drive.WykresZajetoscCalkowita(progressBar1);
            cylinderGauge1.FillPercentage = Drive.ProcentowoZajetosc();
            textBox3.Text = DyskiFizyczneInfo();
            wykresProcentowyUdzialMulti();
            Drive.WykresZajetoscCalkowita(pictureBox1);
            wykresZajeteWolneMulti();
            
        }

        private string DyskiFizyczneInfo()
        {
            StringBuilder opis = new StringBuilder();
            opis.AppendLine("Dysk fizyczny:\t\t\tLiczba partycji");
            opis.AppendLine("===========================================");
            HashSet<string>listaFiz=new HashSet<string>();
            foreach (KeyValuePair<string, string> dysk in listaDyskow)
            {
                listaFiz.Add(dysk.Value.Substring(19));
            }
            foreach (string s in listaFiz)
            {
                opis.AppendLine(s);
            }
            return opis.ToString();
        }

        private void filitracjaNosnikow()
        {
            comboBox1.Text = "";
            comboBox1.Items.Clear();
            if (radioButton1.Checked)
            {
                wyswietlWszytskie();
            }
            if (radioButton2.Checked)
            {
                wyswietlHDD();
            }
            if (radioButton3.Checked)
            {
                wyswietlCD();
            }
            if (radioButton4.Checked)
            {
                wyswietlFlash();
            }
            if (radioButton5.Checked)
            {
                wyswietlSieciowe();
            }
            if (radioButton6.Checked)
            {
                wyswietlDyskietki();
            }
        }

        private void FrmNowyNosnik_Leave(object sender, EventArgs e)
        {
           // OtwarteFormy.FormaPomocnicza = null;
           
        }

        private void FrmNowyNosnik_Load(object sender, EventArgs e)
        {

     
            
        }

        private void InfoDysk(DriveInfo di)
        {
            richTextBox1.Text = "";
            try
            {
                richTextBox1.AppendText(listaDyskow[di.Name.Substring(0, 2)].Substring(0,19) + "\n");
                richTextBox1.AppendText(listaDyskow[di.Name.Substring(0, 2)].Substring(19) + "\n");
            }
            catch { }
            richTextBox1.AppendText(di.OpisDysku());

        }

        private static void KatalogujNosnik(DriveInfo di, Katalog temp)
        {
            di.DodajDoKatalogu(temp,us);
            
        }
        private static void KatalogujNosnik(DriveInfo di, Katalog temp,string nazA)
        {
            di.DodajDoKatalogu(temp, us,nazA);

        }

        private void odswiez()
        {
            filitracjaNosnikow();
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            filitracjaNosnikow();
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            filitracjaNosnikow();
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            filitracjaNosnikow();
        }

        private void radioButton4_CheckedChanged(object sender, EventArgs e)
        {
            filitracjaNosnikow();
        }

        private void radioButton5_CheckedChanged(object sender, EventArgs e)
        {
            filitracjaNosnikow();
        }

        private void radioButton6_CheckedChanged(object sender, EventArgs e)
        {
            filitracjaNosnikow();
        }

        private void Skanuj()
        {
            DriveInfo di = new DriveInfo(comboBox1.SelectedItem.ToString().Substring(0, 2));
            Katalog temp = (Katalog)comboBox2.SelectedItem;
            KatalogujNosnik(di, temp);
        }

        private void wykresProcentowyUdzialMulti()
        {
            List<string> Nazwy = new List<string>();
            List<double> Wartosci = new List<double>();
            multiBarGauge1.BarMaxGap = Drive.DyskiGotowe().Length;
            multiBarGauge1.ScaleMax = 100;
            foreach (DriveInfo di in Drive.DyskiGotowe())
            {
                Wartosci.Add(di.ProcentowoWzgledemCalosci());
                Nazwy.Add(di.Name);
            }
            multiBarGauge1.BarLabels = Nazwy.ToArray();
            multiBarGauge1.BarValues = Wartosci.ToArray();
        }

        private void wykresZajeteWolneMulti()
        {
            List<string> Nazwy = new List<string>();
            List<double> Wartosci = new List<double>();
            multiBarGauge2.BarMaxGap = Drive.DyskiGotowe().Length;
            multiBarGauge2.ScaleMax = 100;
            foreach (DriveInfo di in Drive.DyskiGotowe())
            {
                Wartosci.Add(di.ProcentowoZajete());
                Nazwy.Add(di.Name);
            }
            multiBarGauge2.BarLabels = Nazwy.ToArray();
            multiBarGauge2.BarValues = Wartosci.ToArray();
        }

        private void WykryjDyskSkanowany()
        {
            try
            {
                if (comboBox1.SelectedItem.ToString() != "" && comboBox2.SelectedItem.ToString() != "")
                {
                    this.btnSkanuj.Enabled = true;
                    this.label3.Text = "Nieskanowano";
                    this.btnSkanuj.Text = "Skanuj";
                    statusLight1.Value = 1;
                    DriveInfo di = new DriveInfo(comboBox1.SelectedItem.ToString().Substring(0, 2));
                    try
                    {
                        foreach (Nosnik n in Katalog.WczytaneKatalogi[comboBox2.SelectedItem.ToString()].Nosniki)
                        {
                            if ((di.VolumeSerial() == n.NrSeryjny) && (di.TotalSize == n.Wielkosc))
                            {
                                this.label3.Text = "Zeskanowano " + n.DataAktulizacji.ToShortDateString();
                                this.btnSkanuj.Text = "Aktualizuj";
                                this.btnSkanuj.Enabled = true;
                                statusLight1.Value = 2;
                                break;
                            }
                            else
                            {
                                this.btnSkanuj.Enabled = true;
                                this.label3.Text = "Nieskanowano";
                                this.btnSkanuj.Text = "Skanuj";
                                statusLight1.Value = 1;
                            }
                        }
                    }
                    catch { }
                }
                else
                {
                    this.btnSkanuj.Enabled = false;
                    this.label3.Text = "";
                    statusLight1.Value = 0;
                }
            }
            catch { }

            
    
        }

        private void wyswietlCD()
        {
            foreach (DriveInfo di in Drive.DyskiOptyczne())
            {
                comboBox1.Items.Add(di.Name + " " + di.VolumeLabel + " " + di.RodzajDysku());
            }
        }

        private void wyswietlDyskietki()
        {
            foreach (DriveInfo di in Drive.DyskiWymienne())
            {
                if(di.RodzajDysku()==RodzajNosnika.Dyskietka)
                comboBox1.Items.Add(di.Name + " " + di.VolumeLabel + " " + di.RodzajDysku());
            }
        }

        private void wyswietlFlash()
        {
            foreach (DriveInfo di in Drive.DyskiWymienne())
            {
                comboBox1.Items.Add(di.Name + " " + di.VolumeLabel + " " + di.RodzajDysku());
            }
           
        }

        private void wyswietlHDD()
        {
            foreach (DriveInfo di in Drive.DyskiTwarde())
            {
                comboBox1.Items.Add(di.Name + " " + di.VolumeLabel + " " + di.RodzajDysku());
            }
        }

        private void wyswietlSieciowe()
        {
            foreach (DriveInfo di in Drive.DyskiSieciowe())
            {
                comboBox1.Items.Add(di.Name + " " + di.VolumeLabel + " " + di.RodzajDysku());
            }
        }

        private void wyswietlWszytskie()
        {
            foreach (DriveInfo di in Drive.DyskiGotowe())
            {
                comboBox1.Items.Add(di.Name + " " + di.VolumeLabel + " " + di.RodzajDysku());
            }
        }

		#endregion Methods 

        private void button9_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                checkedListBox1.SetItemChecked(i, false);
            }

        }

    }
}
